#include "DialogGuardarXML.h"
#include <stdexcept>

#include <gtkmm/menuitem.h>
#include <gtkmm/filefilter.h>
#include <gtkmm/messagedialog.h>
#include <gtkmm/stock.h>

DialogGuardarXML::DialogGuardarXML(Glib::RefPtr<Gtk::Builder> b, std::string nomMenuItem,
	Configuraciones** params, Gtk::Window& parentWin)
	: FileChooserDialog(parentWin, "Guardar archivo de configuración", Gtk::FILE_CHOOSER_ACTION_SAVE)
{
	// Agrega los botones al cuadro de dialogo
	this->add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK);
	this->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);

	// Se agregan los filtros para que solo se puedan guardar los archivos XML
	Glib::RefPtr<Gtk::FileFilter> filtro = Gtk::FileFilter::create();
	filtro->set_name("Archivos XML");
	filtro->add_mime_type("text/xml");

	this->add_filter(filtro);

	// Se conecta al menú de abrir archivos
	Gtk::MenuItem* pMenu = 0;
	b->get_widget(nomMenuItem, pMenu);

	if (!pMenu) throw std::runtime_error("No existe el menú de '"+ nomMenuItem +"'");

	pMenu->signal_activate().connect( sigc::mem_fun(*this, &DialogGuardarXML::abrirDialogo) );

	// Donde guarda las configuraciones cargadas
	this->_pConfig = params;
}


DialogGuardarXML::~DialogGuardarXML(){
}


void DialogGuardarXML::abrirDialogo(){
	int resul = this->run();
	this->hide();

	// Si cancela la seleccion no pasa nada
	if (resul == Gtk::RESPONSE_CANCEL) return;

	try {
		// Si no existe se crea 
		if (*this->_pConfig == NULL){
			*this->_pConfig = new Configuraciones(this->get_filename());
		}

		// Se guarda el archivo
		(*this->_pConfig)->guardar();

	} catch (std::runtime_error& rt){
		Gtk::MessageDialog md("Error al guardar el archivo de configuraciones");
		md.set_secondary_text(rt.what());
		md.set_transient_for(*this->get_transient_for());

		md.run();
	}
}



